package com.esbi.projectwebsocket.jwt;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JWTExample {


    // 密钥，应该保存在安全的地方，不要硬编码在代码中
    // 这是一个示例密钥，实际使用时应该使用更复杂且安全的密钥
    private static final String SECRET_KEY = "your-secret-key";

    // 主方法，程序的入口点
    public static void main(String[] args) {
        // 生成JWT
        String jwt = generateJwt();
        System.out.println("生成 JWT: " + jwt);

        // 测试生成的JWT是否有效
        boolean isJwtValid = testJwt(jwt);
        System.out.println("测试JWT是否正确: " + isJwtValid);
    }

    /**
     * 生成JWT的方法
     *
     * @return 生成的JWT字符串
     */
    public static String generateJwt() {
        // 创建一个包含自定义声明的Map，这里我们添加了一个"user"声明
        Map<String, Object> claims = new HashMap<>();
        claims.put("user", "testUser");

        // 使用Jwts.builder()开始构建JWT
        return Jwts.builder()
                // 设置自定义声明
                .setClaims(claims)
                // 设置JWT的主题，通常是一个标识用户的唯一字符串
                .setSubject("JWT Subject")
                // 设置JWT的签发时间
                .setIssuedAt(new Date(System.currentTimeMillis()))
                // 设置JWT的过期时间，这里设置为10小时后过期
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10))
                // 使用HS256算法和指定的密钥进行签名
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                // 生成并返回JWT字符串
                .compact();
    }

    /**
     * 验证JWT的方法
     *
     * @param jwt 要验证的JWT字符串
     * @return 如果JWT有效则返回true，否则返回false
     */
    public static boolean verifyJwt(String jwt) {
        try {
            // 解析JWT字符串，获取Claims对象
            Claims claims = Jwts.parser()
                    // 设置签名密钥
                    .setSigningKey(SECRET_KEY)
                    // 解析JWT字符串
                    .parseClaimsJws(jwt)
                    // 获取Claims对象
                    .getBody();

            // 打印JWT中的信息（可选）
            System.out.println("用户User: " + claims.get("user"));
            System.out.println("主题Subject: " + claims.getSubject());
            System.out.println("Issued At: " + claims.getIssuedAt());
            System.out.println("Expiration: " + claims.getExpiration());

            // 如果解析成功，则认为JWT有效
            return true;
        } catch (Exception e) {
            // 如果解析过程中出现异常，则认为JWT无效
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 测试JWT的方法
     * 这个方法首先生成一个JWT，然后立即验证它，以确保生成和验证的逻辑是正确的
     *
     * @param jwt 要测试的JWT字符串
     * @return 如果JWT有效则返回true，否则返回false
     */
    public static boolean testJwt(String jwt) {
        // 验证JWT是否有效
        return verifyJwt(jwt);
    }
}